/**
 * WebSocketService类 - 管理WebSocket连接和消息通信
 * 提供WebSocket连接建立、消息发送、断开连接及回调注册等功能
 */
class WebSocketService {
  /**
   * 构造函数 - 初始化WebSocketService实例
   * @param {string} username - 当前用户的用户名
   * 初始化WebSocket实例、消息回调和状态回调函数引用
   */
  constructor(username) {
    this.ws = null; // WebSocket实例，初始为null
    this.messageCallback = null; // 消息接收回调函数
    this.statusCallback = null; // 连接状态变化回调函数
    this.username = username; // 保存当前用户名，用于构建连接URL
  }

  /**
   * 建立WebSocket连接
   * 根据保存的用户名构建连接URL，创建WebSocket实例并设置各类事件处理器
   */
  connect() {
    // WebSocket连接地址，根据后端配置修改
    const wsUrl = `ws://localhost:8089/chat/${this.username}`;
    // 创建WebSocket实例并建立连接
    this.ws = new WebSocket(wsUrl);

    // WebSocket连接建立成功事件处理器
    this.ws.onopen = () => {
      console.log('WebSocket连接已建立');
      // 如果设置了状态回调函数，则通知连接已建立
      if (this.statusCallback) {
        this.statusCallback('connected');
      }
    };

    // WebSocket消息接收事件处理器 - 接收并解析WebSocket消息
    this.ws.onmessage = (event) => {
      try {
        // 解析接收到的JSON格式消息
        const message = JSON.parse(event.data);
        // 如果设置了消息回调函数，则将解析后的消息传递给回调函数处理
        if (this.messageCallback) {
          this.messageCallback(message);
        }
      } catch (error) {
        // 消息解析失败时输出错误日志
        console.error('解析WebSocket消息失败:', error);
      }
    };

    // WebSocket连接关闭事件处理器
    this.ws.onclose = () => {
      console.log('WebSocket连接已关闭');
      // 如果设置了状态回调函数，则通知连接已关闭
      if (this.statusCallback) {
        this.statusCallback('disconnected');
      }
    };

    // WebSocket连接错误事件处理器
    this.ws.onerror = (error) => {
      // 输出错误日志
      console.error('WebSocket错误:', error);
      // 如果设置了状态回调函数，则通知连接出错
      if (this.statusCallback) {
        this.statusCallback('error');
      }
    };
  }

  /**
   * 发送消息
   * @param {object} message - 要发送的消息对象
   * @returns {boolean} 发送是否成功
   * 检查WebSocket连接状态，只有在连接打开状态下才发送消息
   */
  sendMessage(message) {
    // 检查WebSocket实例是否存在且连接状态为OPEN
    if (this.ws && this.ws.readyState === WebSocket.OPEN) {
      // 将消息对象转换为JSON字符串并发送
      this.ws.send(JSON.stringify(message));
      return true; // 发送成功
    }
    return false; // 发送失败（WebSocket未连接或已关闭）
  }

  /**
   * 断开WebSocket连接
   * 关闭WebSocket连接并清空WebSocket实例引用，释放资源
   */
  disconnect() {
    // 检查WebSocket实例是否存在
    if (this.ws) {
      // 关闭WebSocket连接
      this.ws.close();
      // 清空WebSocket实例引用，避免内存泄漏
      this.ws = null;
    }
  }

  /**
   * 注册消息接收回调函数
   * @param {function} callback - 消息接收回调函数，接收一个参数（消息对象）
   * 设置当接收到WebSocket消息时要调用的回调函数
   */
  setOnMessageCallback(callback) {
    // 保存消息回调函数引用
    this.messageCallback = callback;
  }

  /**
   * 注册连接状态变化回调函数
   * @param {function} callback - 状态变化回调函数，接收一个参数（状态字符串）
   * 设置当WebSocket连接状态变化时要调用的回调函数
   */
  setOnStatusCallback(callback) {
    // 保存状态回调函数引用
    this.statusCallback = callback;
  }
}

// 导出WebSocketService类，供其他模块导入使用
export default WebSocketService;